Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 17.01.2017, 20:49
Профессор
Отправить личное сообщение для smart-create Посмотреть профиль Найти все сообщения от smart-create
 
Регистрация: 25.10.2016
Сообщений: 157

Вывод ошибок сервера через AJAX
Добрый день! Проблема следующая - осуществляю загрузку изображений на сайте пользователем. Само собой для загружаемого элемента существуют некоторые ограничения - расширение файла, вес, размер. Хочу сделать что бы посетитель видел отчет по каждой из причин если они возникли, то есть "Недопустимый тип"файла, "Превышен максимальный размер" и т.д.

Форма выглядит таким образом:
<form id="feeds" method="post" action="<?php echo base_url(); ?>feeds/add_feeds" enctype="multipart/form-data">
	<input type="text" placeholder="Заголовок статьи" name="title" />
	<input type="text" placeholder="Ключ статьи" name="key_n" />
	<textarea placeholder="Текс статьи" name="txt" rows="10"></textarea>
	<input type="file" name="userfile" />
	<button type="submit" class="button--8">ОПУБЛИКОВАТЬ</button>
</form>


Сервер:
function add_feeds() {
	$config['upload_path'] = './library/img/news/';
	$config['allowed_types'] = 'gif|jpg|png|jpeg';
	$config['max_size']	= '100';
	$config['max_width']  = '1024';
	$config['max_height']  = '768';
	$config['encrypt_name']	= TRUE;
	$config['remove_spaces'] = TRUE;
	$this->load->library('upload', $config);
	
	if ( ! $this->upload->do_upload()){
		$error = array('error' => $this->upload->display_errors());
		$this->load->view('pages/feeds/index', $error);
	}else{
		$image_data = $this->upload->data();
			
		$feeds['title']  = $_POST['title'];
		$feeds['txt'] = $_POST['txt'];
		$feeds['key_n'] = $_POST['key_n'];
		$feeds['img'] = $image_data['file_name'];
		$this->main_model->new_feeds($feeds);
                echo json_encode($feeds);
	}
}


Сервер написан на php-фреймворке Codignaiter, обработка и отображение ошибок происходит вот в этой части кода:
if ( ! $this->upload->do_upload()){
	$error = array('error' => $this->upload->display_errors());
	$this->load->view('pages/feeds/index', $error);
}


Для того что бы ошибка отображалась на страницу добавляю вот это:
<?php if (isset($error)) {?>
	<?php echo $error;?>
<?php }?>


И если на форму не вешать аякс, что бы отправка на сервер происходила обновлением страницы, то вывод ошибок будет работать, а вот если повесить аякс, то нет...
Конечно, в скрипте можно вывести какой-то allert с ошибкой типа "Что-то пошло не так", но это не совсем то что я хочу, обработчтк выглядит так:
$("form#feeds").submit(function(e){
	e.preventDefault();
	var f = this,
		form = new FormData(this),
        s = $(f.elements).last(),
        e = s.end().slice(0, -2).removeClass('input-error').filter(function() {
            return !$.trim(this.value)
        });
    if(e.length) e.addClass('input-error');
	else {
		s.prop('disabled', 1);
        s.end().not(s);
		$.ajax({
			url: f.action,
			type: 'POST',
			data: form,
			contentType: false,
			processData: false,
			cache: false,
			dataType: 'json',
			success: function(data) {
				f.reset();
				s.prop('disabled', 0);
				e.removeClass('input-error');
				$("#content").load("feeds #content");
			},
			error: function() {
				// здесь вывести ошибку
			}
		});
	}
});


Я догадываюсь что мне каким-то образом нужно вывести вот это:
<?php if (isset($error)) {?>
	<?php echo $error;?>
<?php }?>

здесь:
error: function() {
        // здесь вывести ошибку
}


Но, как это сделать я не понимаю, и не могу найти адекватного ответа в интернете, прошу помочь, словом или делом))
Ответить с цитированием
  #2 (permalink)  
Старый 17.01.2017, 21:27
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Это dataType: 'json', для красоты в коде или же все-таки для дела?
А если для дела, то что мешает?

if (!$this->upload->do_upload()) exit(json_encode(array('error' => $this->upload->display_errors())));


Опять вопросы к JS отношения не имеющие.
Ответить с цитированием
  #3 (permalink)  
Старый 17.01.2017, 22:58
Профессор
Отправить личное сообщение для smart-create Посмотреть профиль Найти все сообщения от smart-create
 
Регистрация: 25.10.2016
Сообщений: 157

laimas, нечего не мешает, я банально не знаю как это делается, некогда раньше не приходилось сталкиваться с подобным, увы..., сейчас вот первый раз столкнулся и запутался..

изменил скрипт пхп с учетом вашего ответа, получилось так:
function add_feeds() {
		$config['upload_path'] = './library/img/news/';
		$config['allowed_types'] = 'gif|jpg|png|jpeg';
		$config['max_size']	= '500';
		$config['max_width']  = '1024';
		$config['max_height']  = '768';
		$config['encrypt_name']	= TRUE;
		$config['remove_spaces'] = TRUE;
		$this->load->library('upload', $config);
	
		if ( ! $this->upload->do_upload()) exit (json_encode(array('error' => $this->upload->display_errors())));
			
		$image_data = $this->upload->data();
			
		$feeds['title']  = $_POST['title'];
		$feeds['txt'] = $_POST['txt'];
		$feeds['key_n'] = $_POST['key_n'];
		$feeds['img'] = $image_data['file_name'];
			
		echo json_encode($feeds);
		$this->main_model->new_feeds($feeds);
	}

Дальше я увы, просто не понимаю как это обработать в error моего аякса..., если не сложно пожалуйста подскажите, или хотя бы укажите где почитать об этом я и правда с ног уже сбился не могу не где толковой информации найти(
Ответить с цитированием
  #4 (permalink)  
Старый 18.01.2017, 05:43
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Сообщение от smart-create
Дальше я увы, просто не понимаю как это обработать в error моего аякса
Да если бы только это. Может заказать работу? Почему не
$this->main_model->new_feeds($feeds);
echo json_encode($feeds);

а
echo json_encode($feeds);
$this->main_model->new_feeds($feeds);

Что может произойти если метод new_feeds() вернет ошибку?

И зачем вообще клиенту json_encode($feeds), если все это у него в форме и так содержится? Куда на клиенте вы это впихнуть собираетесь?

success: function(data) {
    //сервер может вообще ничего не вернуть по разным причинам
    if(data.error) {
            //пришло, что-то по ошибкам, обрабатываем, показываем, и т.п. см. что возвращает метод
    } 
}

Последний раз редактировалось laimas, 18.01.2017 в 06:32.
Ответить с цитированием
  #5 (permalink)  
Старый 19.01.2017, 16:05
Профессор
Отправить личное сообщение для smart-create Посмотреть профиль Найти все сообщения от smart-create
 
Регистрация: 25.10.2016
Сообщений: 157

laimas, я понимаю в это сложно поверить, но буквально до вчера я понятия не имел как работает json_encode(), вчера весь день этому посветил, разобрался и понял всю абсурдность своего вопроса. Прошу прощения за беспокойство и снова благодарю за помощь и уделенное время!
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача через AJAX большого объема данных yambbkru AJAX и COMET 3 20.06.2015 15:18
Вывод ссылки через Javascript johny_torr Общие вопросы Javascript 5 08.12.2013 22:44
Загрузка изображений через AJAX Bezlepkin Элементы интерфейса 12 24.10.2013 01:31
Передача HTML кода на сервер через Ajax KomaLex AJAX и COMET 2 06.12.2012 15:28
<script> через Ajax Snipe AJAX и COMET 48 18.02.2009 04:00